//
//  ViewController.m
//  25-多线程
//
//  Created by 曹曹 on 16/8/17.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *mainThreadDownload;

@property (weak, nonatomic) IBOutlet UIImageView *subThreadDownload;
@end

@implementation ViewController

- (IBAction)cycleTestAction:(id)sender {
    for (int i = 0; i < 1000000; i++) {
        NSLog(@"第-----%d-----次循环", i);
    }
    {/** 4 进程定义，与程序区别？
     区别：
     （1）进程能真实地描述并发，而程序不能。
     （2）动态性是进程的基本特征，进程实体具有创建、执行和撤销的生命周期，而程序只是一组有序指令的集合，存放在某种介质上，是静态的。（3）进程的具有创建其他进程的功能，而程序没有。
     定义：进程是进程实体的运行过程，是系统进行资源分配和调度的一个独立单位。
     5 什么是操作系统，操作系统的主要功能？操作系统有哪些基本特性？操作系统是一组控制和管理计算机硬件和软件资源，合理地对各类作业进行调度以及方便用户使用的程序的集合。操作系统的主要功能： 
     （1）处理机管理功能
     （2）存储器管理功能
     （3）设备管理功能
     （4）文件管理功能
     （5）用户接口  操作系统具有4个基本特征：（
        1）并发性。指宏观上在一段时间内有多道程序在同时运行，而微观上这些程序是在交替执行。
        2）共享性。因程序的并发执行而使系统中的软、硬件资源不再为某个程序独占，而是由多个程序共同使用。（
        3）虚拟性。多道程序设计技术把一台物理计算机虚拟为多台逻辑上的计算机，使得每个用户都感觉是“独占”计算机。
        4）异步性。多道程序系统中，各程序之间存在着直接或间接的联系，程序的推进速度受到其他程序的影响，这样，程序运行的顺序、程序完成的时间都是不确定的。但各程序运行的结果都应该是确定的。
     6 分页和分段有哪些区别？分页是将一个进程的逻辑地址空间分成若干大小相等的部分，每一部分称作页面。分段是一组逻辑信息的集合，即一个作业中相对独立的部分。  
     分页和分段的主要区别是：-页是信息的物理单位，段是信息的逻辑单位；--页的大小是由系统固定的，段的长度因段而异，由用户决定；-分页的作业地址空间是一维的，分段的作业地址空间是二维的。  
     */}
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
#pragma mark - iOS下的多线程
    // 1.进程和线程
    // 什么是进程? 进程是当用户下达执行应用程序的命令时, 所启动的东西。进程比作工厂
    // 什么是线程? 线程是进程的执行单位, 线程比作工人
    // 2.多线程
    // 为了更好的进行一些程序的操作,节省时间, 提高效率
    // 一个进程不能多多的创建线程, 否则资源消耗过大(工厂不能有太多工人, 工资发不起...) 合理范围是开辟5个左右的线程
    // 注意: 所有UI的操作, 都放在主线程中进行
    // 需要开辟线程的耗时操作, 图像文字渲染, 大数据存储, 网络请求等
    // 3.NSThread
    //  1>当前线程currentThread
    //  获取到当前线程<NSThread: 0x608000075800>{number = 1, name = main}
    //  name - 线程名,number - 线程编号
    //  main - 代表主线程
//    NSThread *currentThread = [NSThread currentThread];
//    NSLog(@"currentThread:%@", currentThread);
    //  2>开辟子线程执行操作
    //    子线程随机创建
//    [NSThread detachNewThreadSelector:@selector(newThreadAction) toTarget:self withObject:nil];
//    [NSThread detachNewThreadWithBlock:^{
//        NSThread *newThread = [NSThread currentThread];
//        NSLog(@"blockThread:%@", newThread);
//    }];
    
    //  3>延迟当前线程的执行, 固定时间
//    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
//    [NSThread sleepUntilDate:date];
    //  4>相对时间
//    [NSThread sleepForTimeInterval:10];
//    NSLog(@"1111");
    //  5>退出当前线程, 不要推出主线程
    //    退出后, 线程后的操作不会再执行
    // [NSThread exit];
//    NSLog(@"mainThread:%@", [NSThread mainThread]);
    //  6>threadPriority 线程优先级
    //    默认优先级都是0.5;
//    double priority = [NSThread threadPriority];
//    NSLog(@"priority:%lf", priority);
//    //  7>name 线程名
//    [NSThread mainThread].name = @"王鍠说不能改主线程的名字";
//    NSLog(@"%@", [NSThread mainThread]);
    //  8>isMainThread 判断是否是主线程
    //   判断当前线程
//    [NSThread isMainThread];
    //   判断线程对象是否是主线程
//    [[NSThread mainThread] isMainThread];
    //  9>初始化方法, 需要手动管理线程的生命周期
    //   初始化一个未启动的线程
//    NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadAction) object:nil];
//    [myThread start];
    // 主线程下载路飞图片
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"]];
    _mainThreadDownload.image = [UIImage imageWithData:data];
    //  10>将耗时的操作放入后台, 不关心线程问题
    [self performSelectorInBackground:@selector(downloadImageOnBackThread) withObject:data];
    //  11>performSelectorOnMainThread返回主线程执行操作
}

- (void)downloadImageOnMainThread:(id)object {
    _subThreadDownload.image = [UIImage imageWithData:object];
}
// 不要再子线程做UI的操作, 会导致一些问题
- (void)downloadImageOnBackThread {
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lingyu.me/wp-content/uploads/2016/08/www.lingyu.me_20160808081654350.jpg"]];
    [self performSelectorOnMainThread:@selector(downloadImageOnMainThread:) withObject:data waitUntilDone:YES];
}

- (void)myThreadAction {
    NSLog(@"        %s", __func__);
    for (int i = 0; i < 1000; i++) {
        NSLog(@"%d", i);
        if (i == 999) {
            [NSThread exit];
        }
    }
}

- (void)newThreadAction {
    NSThread *newThread = [NSThread currentThread];
    double priority = [NSThread threadPriority];
    newThread.name = @"徐小污的线程";
    NSLog(@"newThread:%@-----%lf", newThread, priority);;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
